#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;
typedef pair<double, double> PDD;

const int N = 20, M = 1 << 18;
const double eps = 1e-8;

int f[M];
PDD q[N];
// 思路：由于每两只猪能够确定一条抛物线，所以可以先确定一下由每两只猪构成的抛物线总共能击毁猪的状态
int path[N][N];
int n, m;
// 浮点数的判断需要考虑精度问题

int cmp(double x, double y)
{
    if (fabs(x - y) < eps)
        return 0;
    else if (x < y)
        return -1;
    return 1;
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        cin >> n >> m;
        for (int i = 0; i < n; ++i)
            cin >> q[i].first >> q[i].second;
        // 由于有多组测试数据，在进行预处理前需要先清空
        memset(path, 0, sizeof path);

        for (int i = 0; i < n; ++i)
        {
            // 由于有的数据有可能只有一只猪，如果只经过一只猪就特殊处理成这条抛物线只经过这只猪
            path[i][i] = 1 << i;
            for (int j = i + 1; j < n; ++j)
            {
                double x1 = q[i].first, y1 = q[i].second;
                double x2 = q[j].first, y2 = q[j].second;
                // 如果两个点在同一个横坐标上，那肯定不可能同时打到
                if (!cmp(x1, x2))
                    continue;
                double a = (y1 / x1 - y2 / x2) / (x1 - x2);
                double b = y1 / x1 - a * x1;
                // 由于抛物线不可能向上，所以a 不能是大于0的数
                if (cmp(a, 0) >= 0)
                    continue;
                for (int k = 0; k < n; ++k)
                {
                    double x = q[k].first, y = q[k].second;
                    if (!cmp(a * x * x + b * x, y))
                        path[i][j] += 1 << k;
                }
                path[j][i] = path[i][j];
            }
        }

        memset(f, 0x3f, sizeof f);
        f[0] = 0;
        for (int i = 0; i + 1 < 1 << n; ++i)
        {
            // 找到一只没有被击碎的猪
            int x = 0;
            for (int j = 0; j < n; ++j)
                if (!(i >> j & 1))
                {
                    x = j;
                    break;
                }
            // 枚举所有经过该只小猪的抛物线
            for (int j = 0; j < n; ++j)
                f[i | path[x][j]] = min(f[i | path[x][j]], f[i] + 1);
        }
        cout << f[(1 << n) - 1] << endl;
    }
    return 0;
}
